import { useWidthUserHooks } from '@/stores/user'
import axios from 'axios'
// 变量isRefreshing
let isRefreshing = false
// 后续的请求队列
const requestList: ((newToken: any) => void)[] = []

axios.defaults.baseURL = import.meta.env.VITE_BASEURL

axios.interceptors.request.use((config) => {
  const token = localStorage.getItem('token')

  if (token) {
    // 携带 token
    config.headers.Authorization = 'Bearer ' + token
  }
  console.log('config-----', config)
  return config
})

axios.interceptors.response.use(async (response) => {
  const { code } = response.data
  // 状态
  if (code === 401) {
    // 控制是否在刷新token的状态
    if (!isRefreshing) {
      // 修改isRefreshing状态
      isRefreshing = true
      // 这里是获取新token的接口，方法在这里省略了。
      const res = await refreshToken()
      const token = res.data.data.token
      if (res && token) {
        // 新token
        const newToken = token
        // 保存新的accessToken
        localStorage.setItem('token', newToken)
        // 替换新accessToken
        response.config.headers.Authorization = 'bearer ' + newToken
        // token 刷新后将数组里的请求队列方法重新执行
        requestList.forEach((cb) => cb(newToken))
        // 重新请求完清空
        requestList.length = 0

        // 继续未完成的请求
        const resp = await axios.request(response.config)
        // 重置状态
        isRefreshing = false
        // 返回请求结果
        return resp
      } else {
        // 清除token
        localStorage.clear()
        // 重置状态
        isRefreshing = false
        // 跳转到登录页
        // quitLogin
      }
    } else {
      // 后面的请求走这里排队
      // 返回未执行 resolve 的 Promise
      return new Promise((resolve) => {
        // 用函数形式将 resolve 存入，等待获取新token后再执行
        requestList.push((newToken) => {
          response.config.headers.Authorization = 'bearer ' + newToken
          resolve(axios(response.config))
        })
      })
    }
  }
  return response
})

function refreshToken() {
  return axios.get('/refresh/token', {
    params: { refreshToken: localStorage.getItem('refreshToken') }
  })
}
